/**
 * 
 */
package com.ms.service.module.account;

import java.util.Map;
import java.util.Map.Entry;

/**
 * 組合 http 網址與參數<br>
 * 產生像這樣的網址<br>
 * http://aa.com/bb.asp?var1=1000&var2=2000&var3=30000
 */
public class UrlAppender {
	/** 第一個參數分隔字元預設值 */
	private static final String defaultFirstSeparateChar = "?";

	/** 第一個之後的其他參數分隔字元預設值 */
	private static final String defaultOtherSeparateChar = "&";

	/** 基礎網址，增加的參數會插入一個分隔字元並加在基礎網址後面 */
	private String resultUrl;

	/** 第一個參數分隔字元 */
	private String firstSeparateChar = defaultFirstSeparateChar;

	/** 第一個之後的其他參數分隔字元 */
	private String otherSeparateChar = defaultOtherSeparateChar;

	/** 累計的參數數量 */
	private int appendCount;

	/**
	 * 設定基礎網址
	 * 
	 * @param url
	 *            網址
	 */
	public void setBaseUrl(String url) {
		resultUrl = url;
		appendCount = 0;
	}

	/**
	 * 設定網址參數分隔字元
	 * 
	 * @param first
	 *            第一個參數分隔字元，預設是 {@value #defaultFirstSeparateChar}
	 * @param other
	 *            之後其他的參數分隔字元，預設是 {@value #defaultOtherSeparateChar}
	 */
	public void setSeparateChar(String first, String other) {
		firstSeparateChar = first;
		otherSeparateChar = other;
	}

	/**
	 * 在網址後面加上參數
	 * 
	 * @param key
	 *            參數名稱
	 * @param value
	 *            參數值
	 */
	public void appendParam(String key, String value) {
		if (key == null) {
			return;
		}

		if (value == null) {
			value = "";
		}

		// 分隔字元
		String separateChar = otherSeparateChar;
		// 第一個參數的分隔字元要用問號
		if (appendCount == 0) {
			separateChar = firstSeparateChar;
		}

		// 將參數拼上去
		resultUrl += (separateChar + key + "=" + value);
		appendCount++;
	}

	/**
	 * 在網址後面加上 int 參數
	 * 
	 * @param key
	 *            參數名稱
	 * @param value
	 *            參數值
	 */
	public void appendParamInt(String key, int value) {
		appendParam(key, String.valueOf(value));
	}

	/**
	 * 在網址後面加上 long 參數
	 * 
	 * @param key
	 *            參數名稱
	 * @param value
	 *            參數值
	 */
	public void appendParamLong(String key, long value) {
		appendParam(key, String.valueOf(value));
	}

	/**
	 * 透過 map 加入一批的參數
	 * 
	 * @param paramMap
	 *            參數 map
	 */
	public void appendFromMap(Map<String, String> paramMap) {
		if (paramMap == null) {
			return;
		}
		for (Entry<String, String> entry : paramMap.entrySet()) {
			appendParam(entry.getKey(), entry.getValue());
		}
	}

	/**
	 * 取得結果網址
	 * 
	 * @return 網址字串
	 */
	public String getResult() {
		return resultUrl;
	}
}